const sm2 = require('sm-crypto').sm2;
const sm3 = require('sm-crypto').sm3;
const sm4 = require('sm-crypto').sm4;

const msg = 'hello 国密';                // 待保护的原文
console.log('原始消息：', msg);

// ===== SM2 非对称签名/验签 =====
// 生成密钥对（hex 字符串）
let keypair = sm2.generateKeyPairHex();
console.log('\n--- SM2 密钥对 ---');
console.log('公钥: ', keypair.publicKey);   // 130 位 hex，04||x||y
console.log('私钥: ', keypair.privateKey); // 64 位 hex

// 签名（默认 sm3 哈希）
let sig = sm2.doSignature(msg, keypair.privateKey);
console.log('\nSM2 签名：', sig);

// 验签
let verify = sm2.doVerifySignature(msg, sig, keypair.publicKey);
console.log('SM2 验签结果：', verify);   // true

// ===== SM3 哈希 =====
let hash = sm3(msg);
console.log('\nSM3 摘要：', hash);        // 64 位 hex（256 bit）

// ===== SM4 对称加解密 =====
const key = '0123456789abcdeffedcba9876543210'; // 16 字节 = 128 bit
const iv  = '00000000000000000000000000000000';  // 16 字节全 0，CBC 示例
let encryptData = sm4.encrypt(msg, key, { mode: 'cbc', iv }); // 返回 hex
console.log('\nSM4 加密（hex）：', encryptData);

let decryptData = sm4.decrypt(encryptData, key, { mode: 'cbc', iv });
console.log('SM4 解密：', decryptData);   // hello 国密